#include <iostream>
#include <cstring>
namespace ccg
{
    class String
    {
    public:
        String(const char *str)
        {
            int cap = strlen(str) + 1;
            _str = new char[cap];
            strcpy(_str, str);
            _size = cap - 1;
            _cap = cap;
        }
        ~String()
        {
            if (_str)
                delete[] _str;
        }
        String(const String &str)
        {
            int cap = strlen(str.c_str()) + 1;
            _str = new char[cap];
            strcpy(_str, str.c_str());
            _size = cap - 1;
            _cap = cap;
        }
        String &operator=(const String &str)
        {
            // 将原来管理的空间释放掉
            String tmp(str);
         
            std::swap(_str,tmp._str);
            std::swap(_cap,tmp._cap);
            std::swap(_size,tmp._size);
            return *this;
        }

        const char *c_str() const
        {
            return _str;
        }

    private:
        char *_str = nullptr;
        int _cap;
        int _size;
    };

}

// 1.1 如果拷贝赋值里忘记释放旧内存，会出现什么后果？//会出现内存泄漏,因为对于旧内存管理不到了

// 1.2 把拷贝构造/赋值都 =delete 之后，这个类还能在 std::vector<String> 里用吗？  不能,因为没实现移动语义
// 1.3 移动构造能带来哪些性能收益？结合 std::vector<String> 扩容场景量化说明。
// 对与一些将元素添加到vector中后,如果是一些临时对象的场景,可以减少拷贝的次数